/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Cliente;

import Conexion.Pais;
import Conexion.SerializedObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author Beto
 */
public class Modelo implements Runnable {
MENUPRINCIPAL Em;
Partidas par;
ListaJugadores tab;
Tablero tablero;
private Cliente C;
private boolean a;
SerializedObject so1;
SerializedObject so2;
ArrayList<String> usuarios;
String partida;
String Nombre;
ArrayList<Pais> mundo1;
int turnomio;
int contadorpaises;
Jugador yo;


public Modelo(){
    this.C= new Cliente();
    C.crerConex("127.0.0.1", 2000);
    this.mundo1=new ArrayList<Pais>();
    this.mundo1=null;
    this.contadorpaises=1;
    this.yo=new Jugador();

}

public void Jugar(String Nombre){


                BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                boolean finJuego=false;
                SerializedObject so2=null;

                 //this.setVisible(false);
            //tab.setVisible(true);
                while(!finJuego){
                    
                    System.out.println("Esperando Jugada");
                    so2=C.recibir();
                    System.out.println(so2.getTipoM());
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Emisor.class.getName()).log(Level.SEVERE, null, ex);
                        }

                    //Imprimir Mundo
                    System.out.println("Estado actual del Mundo");
                    ArrayList<Pais> mundo=new ArrayList<Pais>();
                    mundo =(ArrayList<Pais>)so2.getObject();
                    String Turno= so2.getTurno();
                    System.out.println(Turno+ "esto es lo que hay en turno");
                    if (this.mundo1==null){
                       mundo1=mundo;
                    }
                    for(int i=0;i<mundo.size();i++){
                            if(mundo.get(i).getUnidades()!=mundo1.get(i).getUnidades()){
                                tablero.pressedboton(mundo.get(i).getNombre(),Turno,mundo.get(i).getUnidades());
                                this.contadorpaises++;
                            }
                            System.out.println(mundo.get(i).getNombre()+" "+
                            mundo.get(i).getJugador()+" "+mundo.get(i).getUnidades());
                    }
                    this.mundo1=mundo;
                    this.tablero.setmundo(mundo1);

                    if(so2.getTipoM().equalsIgnoreCase("ESPERAR")){
                        this.tablero.setaccion("Esperar turno");
                        System.out.println("ESPERAR TURNO");
                    }
                    if(so2.getTipoM().equalsIgnoreCase("TERMINAR")){
                        finJuego=true;
                    }
                    if(so2.getTipoM().equalsIgnoreCase("JUGAR")){
                        this.tablero.setaccion("Selecciona un pais que desees que sea tuyo");
                        System.out.println("TU TURNO");
                        boolean exito=false;
                        while(!exito){
                            System.out.println("Escriba el nombre del pais donde desea ubicar unidades");
                            String temp=null;
                            try {
                                int control=0;
                                while(tablero.contt()==false){
                                    control++;

                                //temp = in.readLine();
                                }

                                this.tablero.setcont();

                            } catch (Exception ex) {
                                Logger.getLogger(Emisor.class.getName()).log(Level.SEVERE, null, ex);
                            }
                            for(int i=0;i<mundo.size();i++){
                                if(mundo.get(i).getNombre().equalsIgnoreCase(tablero.Boton)){
                                    if(mundo.get(i).setJugador(so2.getName())){
                                     mundo.get(i).addUnidades();
                                     exito=true;
                                    }
                                    i=mundo.size();
                                }
                            }
                        }

                        for(int i=0;i<mundo.size();i++){
                            System.out.println(mundo.get(i).getNombre()+" "+
                                    mundo.get(i).getJugador()+" "+mundo.get(i).getUnidades());
                        }
                        SerializedObject so3=new SerializedObject();
                        so3.setObject(mundo);
                        C.enviar(so3);
                        
                    }
                }
                 finJuego=false;
                 this.tablero.setEstado();
                //Ubicar Unidades durante la partida
                //-------------------------
                //-------------------------
                //-------------------------
                 while(!finJuego){
                    System.out.println("Esperando Jugada durante partida");
                    so2=C.recibir();
                    System.out.println(so2.getTipoM());
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Emisor.class.getName()).log(Level.SEVERE, null, ex);
                        }

                    //Imprimir Mundo
                    System.out.println("Estado actual del Mundo");
                    ArrayList<Pais> mundo=new ArrayList<Pais>();
                    ArrayList<Pais> paises=this.yo.getMisPaises();
                    mundo =(ArrayList<Pais>)so2.getObject();
                    this.tablero.setmundo(mundo);
                    for(int i=0;i<mundo.size();i++){
                            System.out.println(mundo.get(i).getNombre()+" "+
                            mundo.get(i).getJugador()+" "+mundo.get(i).getUnidades());
                    }

                    if(so2.getTipoM().equalsIgnoreCase("ESPERAR")){
                        this.tablero.setaccion("Esperar turno");
                        System.out.println("ESPERAR TURNO");
                    }
                    if(so2.getTipoM().equalsIgnoreCase("TERMINAR")){
                        finJuego=true;
                    }
                    if(so2.getTipoM().equalsIgnoreCase("JUGAR")){
                        for(int t=0;t<paises.size();t++){
                            this.tablero.pressedboton(paises.get(t).getNombre(), "20000", t);
                        }
                        System.out.println("TU TURNO");
                        boolean exito=false;
                        int cont=0;
                        cont=Integer.parseInt(so2.getMensaje());
                        this.tablero.setaccion("Puede asignar "+cont+" unidades");
                        System.out.println("Puede asignar "+cont+" unidades");
                        while(!exito){
                            System.out.println("Escriba el nombre del pais donde desea ubicar unidades");
                            String temp=null;
                            int control=0;
                            while (cont>0){
                            while(tablero.contt()==false){
                                    control++;
                               //temp = in.readLine();
                                }

                                cont--;
                                this.tablero.setaccion("Puede asignar "+cont+" unidades");
                        System.out.println("Puede asignar "+cont+" unidades");
                                this.tablero.setcont();
                            }
                          /*  for(int i=0;i<mundo.size();i++){
                                if(mundo.get(i).getNombre().equalsIgnoreCase(temp)){
                                    if(mundo.get(i).setJugador(so2.getName())){
                                     mundo.get(i).addUnidades();
                                     cont--;
                                    }
                                    i=mundo.size();
                                }
                            }*/
                            if(cont==0)
                                exito=true;
                        }
                        mundo=this.tablero.getmundo();
                        for(int i=0;i<mundo.size();i++){
                            System.out.println(mundo.get(i).getNombre()+" "+
                                    mundo.get(i).getJugador()+" "+mundo.get(i).getUnidades());
                        }
                        SerializedObject so3=new SerializedObject();
                        so3.setObject(mundo);
                        C.enviar(so3);
                    }
                    if(so2.getTipoM().equalsIgnoreCase("ATACAR")){

                        this.Atacar();
                    }
                }
            }
public void Atacar(){
                BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                boolean acabo=false;
                boolean exito=false;

                SerializedObject o1=null;
                while(!acabo){
                    System.out.println("ATACAR");
                    o1=C.recibir();
                    ArrayList<Pais> mundo=(ArrayList<Pais>)o1.getObject();
                    for(int i=0;i<mundo.size();i++){
                            System.out.println(mundo.get(i).getNombre()+" "+
                                    mundo.get(i).getJugador()+" "+mundo.get(i).getUnidades());
                        }
                    int pasar=1;
                    int control=0;
                     while(tablero.contt()==false){
                                    control++;
                                    pasar=0;

                               //temp = in.readLine();
                                }
                            this.tablero.setcont();
                    
                    String temp=null;
                            try {
                                temp = in.readLine();
                            } catch (IOException ex) {
                                Logger.getLogger(Emisor.class.getName()).log(Level.SEVERE, null, ex);
                   }
                   if(pasar==0){
                       acabo=true;
                       SerializedObject so3=new SerializedObject();
                                so3.setTipoM("PARAR ATAQUE");
                                C.enviar(so3);
                   }
                   else{
                        exito=false;
                        while(!exito){
                            control=0;
                               while(tablero.contt()==false){
                                    control++;
                               //temp = in.readLine();
                                }
                            this.tablero.setcont();

                            //System.out.println("Escriba el numero del pais desde donde desea atacar");
                            String temp1=null;
                            try {
                                temp1 = in.readLine();
                            } catch (IOException ex) {
                                Logger.getLogger(Emisor.class.getName()).log(Level.SEVERE, null, ex);
                            }
                            System.out.println("Escriba el numero del pais que desea atacar");
                            String temp2=null;
                            try {
                                temp2 = in.readLine();
                            } catch (IOException ex) {
                                Logger.getLogger(Emisor.class.getName()).log(Level.SEVERE, null, ex);
                            }
                            for(int i=0;i<mundo.size();i++){
                                if(mundo.get(i).getNombre().equalsIgnoreCase(temp1)){
                                    /*if(mundo.get(i).esVEc(temp2)){
                                        int t=Integer.parseInt(temp2);
                                        if(mundo.get(i).getJugador().equalsIgnoreCase(mundo.get(t-1).getJugador()))
                                            System.out.println("No te puedes ATACAR a ti mismo");
                                        else{
                                            exito=true;
                                            i=mundo.size();
                                        }
                                    }*/
                                }
                            }
                            if(exito){
                                SerializedObject so3=new SerializedObject();
                                so3.setTipoM("CONTINUAR");
                                so3.setMensaje(temp1+" "+temp2);
                                C.enviar(so3);
                            }
                        }
                    }//cierro else
               }
           }
public void run(){

        SerializedObject so1=new SerializedObject();
        SerializedObject so2=null;
        Em= new MENUPRINCIPAL( );
        this.Em.setVisible(true);
         //this.C=new Cliente();
         int cont=0;
         while(this.Em.isVisible()==true){
              cont++;
            //   System.out.println(cont);


         }
         if(this.Em.isVisible()==false){
            a=false;

            System.out.println("entra");
               try {

                par = new Partidas(C,so1,so2);
                    } catch (IOException ex) {
                        Logger.getLogger(MENUPRINCIPAL.class.getName()).log(Level.SEVERE, null, ex);
                        }
                par.setVisible(true);
        }
         cont=0;
         while(par.isVisible()==true){
              cont++;

              //System.out.println(cont);
                    }
         try {

             partida=par.getpartida1();
             Nombre=par.getName1();
             tab = new ListaJugadores(Nombre);
             tab.setVisible(true);
                System.out.println(partida);
                SerializedObject so3=new SerializedObject();
                    so3.setMensaje(partida);
                                        so3.setTipoM("3");
                                        C.enviar(so3);
                SerializedObject so4=null;
                so4=C.recibir();
                System.out.println(so4.getTipoM());
                System.out.println(so4.getMensaje());
                System.out.println(so4.getName());
                usuarios=(ArrayList<String>) so4.getObject();
                System.out.println("este es el tamaño " +usuarios.size());
                for (int i=0;i<usuarios.size();i++){
                System.out.println("son usuarios "  +usuarios.get(i));
                }
                boolean todos=false;
            while(todos==false){
                
                System.out.println(so4.getTipoM());
                usuarios=      (ArrayList<String>) so4.getObject();
                tab.actualizar(usuarios);
                for (int i=0;i<usuarios.size();i++){
                System.out.println("son usuarios dentro del ciclo "  +usuarios.get(i));
                if(usuarios.get(i).matches(Nombre)){
                    this.turnomio=i;
                }
                }
                if (usuarios.size()==3){
                    todos=true;
                }
                else{
                so4=C.recibir();
                }
            }



        } catch (IOException ex) {
            Logger.getLogger(Partidas.class.getName()).log(Level.SEVERE, null, ex);
        }

/*         tab.setVisible(true);
         while(tab.isVisible()==true){
              cont++;
               System.out.println(cont);
                    }*/
         System.out.println("este es miiii turnoooo"+this.turnomio);
         tablero= new Tablero(C,so1,so2,Nombre,turnomio,yo);
         tablero.setVisible(true);
         Jugar(Nombre);







    }
}


